#include <iostream>

using std::cout;
using std::endl;

class Data
{
public:
    Data(int data = 10)
    : _data(data)
    {
        cout << "Data(int = 10)" << endl;
    }

    int getData() const
    {
        return _data;
    }

    ~Data()
    {
        cout << "~Data()" << endl;
    }
private:
    int _data;
};

class SecondLayer
{
public:
    SecondLayer(Data *pdata)
    : _pdata(pdata)
    {
        cout << "SecondLayer(Data *)" << endl;
    }

    //重载的箭头访问运算符
    Data *operator->()
    {
        return _pdata;
    }

    Data &operator*()
    {
        return *_pdata;
    }

    ~SecondLayer()
    {
        cout << "~SecondLayer()" << endl;
        //认为数据成员指针是new出来
        if(_pdata)
        {
            delete  _pdata;
            _pdata = nullptr;
        }
    }
private:
    Data *_pdata;
};

//学习运算符重载的时候，如果能将原始形态展示出来，那么就证明你的
//运算符重载是学会了，否则没有学会
void test()
{
    //sl本身是一个栈对象，但是因为SecondLayer中重载了箭头访问运算符
    //所以sl可以像指针一样使用，并且当sl栈对象销毁的时候，会自动执行
    //析构函数，可以将托管的堆空间进行回收
    //就是后面需要进行学习的智能指针的雏形
    SecondLayer sl(new Data(20));
    /* sl.operator->()->getData();//原始形式 */
    cout << "sl->getData() = " << sl->getData() << endl;//简写
    /* sl.operator*().getData();//原始形式 */
    cout << "(*sl).getData() = " << (*sl).getData() << endl;//简写
}

int main(int argc, char *argv[])
{
    test();
    return 0;
}

